#ifndef LOG_HPP
#define LOG_HPP

#include "../third/log-system/include/interface.hpp"

#ifdef FOR_TEST
    #define LOG_SINK_BASE_PATH "../../logs/data-"
#else
    #define LOG_SINK_BASE_PATH "../logs/data-"
#endif

// 注意避免宏重定义，需要注释掉"interface.hpp"文件中所有LOG_开头的宏定义
// 其他文件中使用该日志器方法如下：
/*
{
    LOG_DEBUG("debug message");
    LOG_INFO("info message: %s", "hello");
    LOG_WARN("warn message, %d", 100);
}
*/

auto LogInit() ->  xzt::log::Logger::ptr
{
    auto limit_level = xzt::log::Level::value::INFO;
    // 对于日志中时间格式，详细自定义参考：your-project/third/log-system/include/format.hpp:32
    // 包含年月日：%Y-%m-%d %H:%M:%S
    std::string formatter = "[%d{%Y-%m-%d %H:%M:%S}][%p][%f:%l]%T%m%n";

    auto logger = xzt::log::createLogger("base-logger", 
                                          limit_level, 
                                          formatter);

    // 设定日志器输出目标 -- 控制台和滚动文件
    std::vector<xzt::log::LogSink::ptr> sinks;
    sinks.push_back(xzt::log::SinkFactory::create<xzt::log::StdoutSink>());
    sinks.push_back(xzt::log::SinkFactory::create<xzt::log::RollingBySizeFileSink>(LOG_SINK_BASE_PATH, 1024*1024*5));
    xzt::log::ResetSinks(logger, sinks);

    return logger;
}

#define LOGGER LogInit()
auto logger = LOGGER;
#define LOG_DEBUG(fmt, ...) logger->_debug(fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...) logger->_info(fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...) logger->_warn(fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) logger->_error(fmt, ##__VA_ARGS__)
#define LOG_FATAL(fmt, ...) logger->_fatal(fmt, ##__VA_ARGS__)


#endif // LOG_HPP